////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxsensorsubmodulebase.h
/// @brief Class declarations sensor submodule base class
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXSENSORSUBMODULEBASE_H
#define CAMXSENSORSUBMODULEBASE_H

#include "camxhwcontext.h"
#include "camxsensornode.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class that implements the common functionality of all sensor sub modules.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class SensorSubModuleBase
{
public:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destroy
    ///
    /// @brief  Delete Submodule object
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID Destroy()
    {
        CAMX_DELETE this;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDeviceHandle
    ///
    /// @brief  Delete Submodule object
    ///
    /// @return CSLDeviceHandle
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CSLDeviceHandle GetDeviceHandle() { return m_hCSLDeviceHandle; }

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Initialize
    ///
    /// @brief  Initialize the submodule
    ///
    /// @param  CSLDeviceIndex          CSL device Index
    /// @param  pDeviceResourceRequest  Acquire Device Info
    /// @param  cameraId                camera Id
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult Initialize(
        INT32               CSLDeviceIndex,
        CSLDeviceResource*  pDeviceResourceRequest,
        UINT32              cameraId);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SensorSubModuleBase
    ///
    /// @brief  Constructor
    ///
    /// @param  pHwContext    Pointer to the hardware context.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    explicit SensorSubModuleBase(
        HwContext*    pHwContext);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~SensorSubModuleBase
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~SensorSubModuleBase();

    HwContext*          m_pHwContext;          ///< Pointer to HW context
    CSLDeviceHandle     m_hCSLDeviceHandle;    ///< Sub module device handle
    CmdBufferManager*   m_pPacketManager;      ///< packet buffer manager
    CmdBufferManager*   m_pCmdBufferManager;   ///< cmd buffer manager
    CSLDeviceType       m_CSLDeviceType;       ///< CSL device type
    UINT32              m_resourseSize;        ///< Resource size
    UINT32              m_poolSize;            ///< Resource size
    BOOL                m_deviceAcquired;      ///< Device Acquire State
    UINT32              m_cameraId;            ///< cameraId associated with the submodule

private:
    SensorSubModuleBase(const SensorSubModuleBase&) = delete;             ///< Disallow the copy constructor.
    SensorSubModuleBase& operator=(const SensorSubModuleBase&) = delete;  ///< Disallow assignment operator.
};

CAMX_NAMESPACE_END

#endif // CAMXSENSORSUBMODULEBASE_H
